/**
 * 应用全局状态（非权限相关）
 */
import { defineStore } from 'pinia';
import { useUserStore } from './user';
import { usePermissionStore } from './permission';

export const useMainStore = defineStore('app', {
	state: () => ({
		systemConfig: {
			isLogin: false, // 登录状态
			sysDeviceInfo: {} as any, // 设备信息
			UpdateSwitch: false,
			UpdatePopupIsOpen: false,
			msgConfig: {
				activeCtx: null,
				openMsgBtnType: true,
				msgNum: 0,
				msgBtnIsHide: false,
				hasMsg: false,
				mainImage: '/static/image/Img/msg.png',
			},
			netWorkinfo: {
				netWorkType: "unknown",
				isConnected: true
			}
		},
		appConfigInfo: {
			ICPServerIP: "https://api.hzyc.org.cn", // 已备案的IP
			LoginIP: "mes.hzyc.org.cn:20050", // 中间平台IP
			serverIP: "", // 选中的帐套IP
			IPAgreement: "http://", // 协议
			Authorization_Info: {} as any, // 授权信息
			routePageCurrent: 1, // 页面栈位置
			comboList: [], // 套餐数据
			selectedComboInfo: {} as any, // 选中套餐信息
		},
		// 记录上次调用时间
		_lastOpenTime: 0,
		// 跳转下拉选页通用变量
		BaseScreenParm: {} as any,
		BaseScreenParmByTree: {},
		SelectPickerSetting: {},
		ImportPickerSetting: {},


		st_ticket: {
			FCJType: uni.getStorageSync('FCJType') ? uni.getStorageSync('FCJType') : null,
		},
		connection: null,
		messages: [],
		SignalRConnect: null,
		IPModel: {
			SignalR_Status: false,
			SignalR_StatusInfo: {},
		},
		SignalRClientID: null,
		SignalRLiveMethod: '',
	}),
	actions: {
		startsWithHttp(url : string) {
			return url.startsWith('http://') || url.startsWith('https://')
		},
		/**
		 * 获取完整的服务器资源路径
		 */
		getReadyStaticUrl(path : any) {
			if (uni.$utils.isEmpty(path)) {
				return ""
			} else {
				if (this.startsWithHttp(path)) {
					return path
				} else {
					let port = this.appConfigInfo.serverIP.split(':')[1];
					return this.appConfigInfo.ICPServerIP + path.replace(/upload/, 'upload/' + port);
				}
			}
		},
		// 内置节流方法（只在 openBaseScreen 内部使用）
		_canRun(delay = 1000) {
			const now = Date.now()
			if (now - this._lastOpenTime >= delay) {
				this._lastOpenTime = now
				return true
			}
			return false
		},
		/**
		 * 打开基础选择器弹窗
		 * @param {Object} [option] - 基础选择器配置选项
		 * @param {boolean} [option.allowClear=false] - 是否显示清除按钮
		 * @param {string} [option.titleName=""] - 弹窗标题名称
		 * @param {string} [option.cmd=''] - 用于数据请求的接口名
		 * @param {string} [option.listeningName=''] - 用于事件监听的名称标识
		 * @param {boolean} [option.multiple=false] - 是否启用多选模式
		 * @param {boolean} [option.enableAddOption=false] - 是否允许新增选项
		 * @param {string} [option.addOptionPath=""] - 新增选项的跳转路径
		 * @param {Object} [option.serverSearch] - 服务端搜索配置
		 * @param {Object} [option.serverSearch.format] - 数据格式映射配置
		 * @param {string} [option.serverSearch.format.displayValue="text"] - 用于显示的字段名
		 * @param {string} [option.serverSearch.format.hiddenValue="id"] - 用于存储的隐藏字段名
		 * @param {string} [option.serverSearch.format.pageIndex="pageIndex"] - 分页页码参数名
		 * @param {string} [option.serverSearch.format.pageSize="pageSize"] - 分页条数参数名
		 * @param {boolean} [option.serverSearch.isLocal=false] - 是否使用本地数据
		 * @param {any[]} [option.serverSearch.localData=[]] - 本地数据源（isLocal为true时有效）
		 * @param {boolean} [option.serverSearch.isPaging=false] - 是否启用分页
		 * @param {string} [option.serverSearch.searchKey=''] - 搜索关键词参数名（应包含在param中）
		 * @param {Array<Object>} [option.serverSearch.subText] - 次级文本显示配置
		 * @param {string} [option.serverSearch.subText[].label] - 次级文本的标签
		 * @param {string} [option.serverSearch.subText[].labelKey] - 次级文本对应的字段名
		 * @param {Object} [option.serverSearch.disabled] - 禁用项配置
		 * @param {any[]} [option.serverSearch.disabled.data=[]] - 禁用数据数组
		 * @param {string} [option.serverSearch.disabled.key=""] - 用于判断禁用的字段名
		 * @param {any[]} [option.serverSearch.choiceData=[]] - 已选中的数据
		 * @param {string} [option.serverSearch.choiceDataKey=""] - 选中数据的标识字段名
		 * @param {boolean} [option.serverSearch.isTree=false] - 是否启用树形结构展示
		 * @param {Record<string, any>} [option.param={}] - 传递给接口的额外参数
		 */
		openBaseScreen(option ?: Partial<any>, delay = 1000) {
			if (!this._canRun(delay)) return

			const defaultConfig = {
				allowClear: false,
				titleName: "",
				cmd: '',
				listeningName: '',
				multiple: false,
				enableAddOption: false,
				addOptionPath: "",
				serverSearch: {
					format: {
						displayValue: "text",
						hiddenValue: "id",
						pageIndex: "pageIndex",
						pageSize: "pageSize",
					},
					isLocal: false,
					localData: [],
					isPaging: false,
					searchKey: '',
					subText: [{
						label: "",
						labelKey: "",
					}],
					disabled: {
						data: [],
						key: "",
					},
					choiceData: [],
					choiceDataKey: "",
					isTree: false,
				},
				param: {},
			}

			this.BaseScreenParm = uni.$utils.deepMerge(defaultConfig, option)

			uni.navigateTo({
				url: "/commonPage/Tool/openBaseScreen"
			})
		}
	},
	persist: {
		key: 'app-store',
		paths: [
			'systemConfig.sysDeviceInfo',
			'appConfigInfo.serverIP',
			'appConfigInfo.IPAgreement',
			'appConfigInfo.Authorization_Info',
			'appConfigInfo.selectedComboInfo',
		]
	}
});